#include <my_header.h>

/* Usage: ./14_mutex_lock */
// 两个线程对同一个共享变量分别加一百万次
#define TIMES 1000000
int global = 0;

void * func(void *arg){
    printf("child thread is runing \n");
    for(int i = 0; i<TIMES; i++){
        global++;
    }
    printf("child thread stop \n");
    return NULL;
}
int main(void)
{
    pthread_t pid;
    pthread_create(&pid,NULL,func,NULL);

    printf("main thread is runing \n");
    for(int i = 0; i<TIMES; i++){
        global++;
    }
    printf("main thread stop \n");

    pthread_join(pid, NULL);
    printf("all over, global = %d \n", global);
    return 0;
}

#if 0
我们发现结果并不是我们期望的二百万。原因是什么呢?


// 以某次逻辑为例
1, 当主线程在读取共享变量时，假设它的值为x, 那么主线
程把它从内存读到寄存器, 把x自增变成x+1再写回内存。
2, 在主线程完成上述操作的过程中，假设在写回内存之前,
子线程可能也已经读取了共享变量的值, 即未被主线程写回
更新之前的x。 子线程的运行也是把自己读取到寄存器的x自
增变成x+1再写回内存。
// 综上, 虽然两个线程都进行了一次逻辑自增执行,但是实
// 际结果产生了覆盖, 最终只增加了1.


如果一个程序的结果是不正确的，那么再高的效率也毫无意
义。在基于之前进程对并发的研究之上，线程库也提供了专
门用于正确地访问共享资源的机制--> **锁。**
#endif
